package com.janko.springbootbase.juc;

import java.util.concurrent.TimeUnit;

/**
 * @Description 类文件说明
 * @Author nieyankang
 * @Version 1.0
 * @date {date} {time}
 */
public class Volatile_Test {
    /**
     * 对比一下有无volatile的情况下，整个程序运行结果的区别
     * 1、当不添加volatile的时候，线程会一直跑着m的方法。因为这个时候，线程“thread1”不知道running改变了
     * 2、对变量值添加volatile的时候，线程之间是可见的。它没有存储到 线程缓存区，是直接刷新到内存的主存区的.
     */
    volatile boolean running = true;

    void m() {
        System.out.println("m start");
        int i = 1;
        while (running) {
            /**
             * System.out.println 会刷新主内存.
             * why?  println的源码中，是添加了Synchronized的
             */
//            System.out.println("一些业务");
            i++;
        }
        System.out.println("m end");
        System.out.println(i);
    }

    public static void main(String[] args) {
        Volatile_Test vTest = new Volatile_Test();
        new Thread(vTest::m, "thread1").start();
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException exception) {
            exception.printStackTrace();
        }
        vTest.running = false;
    }
}
